Skip to content

Chebyshev scalarization for non-convex fronts + evolution-as-inference explorable (0.3.1) - #21

Merged
alexnodeland merged 1 commit into
mainfrom
feat/chebyshev-and-inference-explorable
Jul 28, 2026
Merged

Chebyshev scalarization for non-convex fronts + evolution-as-inference explorable (0.3.1)#21
alexnodeland merged 1 commit into
mainfrom
feat/chebyshev-and-inference-explorable

Conversation

@alexnodeland

Copy link
Copy Markdown
Owner

The two follow-ups noted at the close of #18.

Chebyshev scalarization (inference::pareto::ChebyshevScalarization)

The weighted-max norm max_i w_i·(f_i − z_i) over an ideal point z, with either a latent weight (like ParetoScalarization) or a fixed weight (with_weight) for uniform front sweeps. Pinned at the theorem level on the concave front f1 = x, f2 = 1 − x² (Pareto set exactly [0,1], where every weighted-sum interior stationary point is a maximum):

  • fixed-w weighted sum puts < 0.1 mass in the front interior (endpoint collapse, as the theorem demands);
  • fixed-w Chebyshev concentrates on the interior front point x* = (√5−1)/2 ≈ 0.618 (posterior mean within ±0.08);
  • a three-weight sweep traces low/mid/high front regions.

Working the test surfaced an honesty fix worth calling out: in the latent-weight models the w-marginal is tilted by exp(−s·m(w)) (the scalarized optimum's value at w), so annealing concentrates mass on the best-scoring front regions rather than covering the front uniformly — the conditional x | w is what tracks the front. Both scalarizations' docs now state this explicitly, and a new regression pins the conditional property for latent-w Chebyshev. (My earlier "the posterior traces the front" phrasing was stronger than the convex-case test had actually verified.)

"Evolution as inference" explorable (evo.fugue.run)

ExploreSmcInference (fugue-evo-wasm, now with the ppl feature + a direct fugue-ppl dep) steps the crate's real inference layer one tempering rung per step(): GaussianPrior program, twin-peaks Boltzmann target via FactorFitness, and fugue's SMC primitives (incremental reweight, ESS-triggered systematic resampling, typed-MH rejuvenation, crossover kernel). density_grid returns the exact tempered target so the heat overlay is the analytic density the particles should (and visibly do) match at every β; β MAX extends past 1 into annealed-optimizer territory; log-evidence accumulates live.

  • Engine pinned by: determinism, ladder shape, analytic posterior mean and analytic log-evidence vs 400² grid quadrature, and annealing concentration (mean distance-to-nearest-mode — the honest metric for a multimodal target).
  • Widget (docs/viz/inference.js) follows the site conventions exactly: wasm gate + no-fallback notice, lazy IntersectionObserver init, seeded scrub, controls → canvas → instruction → readouts, reduced-motion synchronous batch, theme-aware heat rebuild.
  • Mounted on Architecture → Evolution as Inference; book.toml registers the viz file; no CI change needed (docs.yml already builds and stages pkg/).
  • Browser-verified against the built wasm: autoplay runs the ladder to β = 1 with both modes populated and plausible ESS/log Z/swap readouts; Replay/Reset/Step all work (screenshots in session).

Validation

9/9 default suites + 5/5 wasm-crate suites green; both minimal feature configs check clean; my files clippy-clean and rustdoc-clean (the pre-existing --all-features workspace-clippy failure and 3 old wasm-crate warnings on main are untouched); fmt clean. Version 0.3.0 → 0.3.1 (additive).

🤖 Generated with Claude Code

https://claude.ai/code/session_01HmWLBR9Zq6hPG5o7URDuNJ

Chebyshev (inference/pareto.rs): ChebyshevScalarization - weighted-max norm
over an ideal point, latent or fixed weight. Reaches non-convex Pareto front
interiors where weighted-sum optima provably collapse to endpoints; pinned
at the theorem level on the concave front f1=x, f2=1-x^2 (fixed-w contrast
+ weight sweep + latent-w conditional tracking). Docs now state the
latent-w marginal tilt exp(-s*m(w)) honestly for both scalarizations.

Explorable (crates/fugue-evo-wasm + docs): ExploreSmcInference steps the
real inference layer one tempering rung per call (GaussianPrior program,
twin-peaks factor likelihood, fugue smc_prior_particles/normalize/resample/
rejuvenate_particles/CrossoverKernel), streaming particles, ESS, resampling
events, crossover swaps, and the running log-evidence; density_grid returns
the exact tempered target for the heat overlay. Engine tests: determinism,
ladder shape, analytic posterior mean + evidence vs grid quadrature,
annealing concentration (distance-to-nearest-mode). Widget (viz/inference.js)
follows the site conventions (wasm gate + notice, lazy init, seeded scrub,
controls/canvas/instruction/readouts, reduced-motion batch); mounted on the
"Evolution as Inference" architecture page; wasm crate gains ppl feature +
direct fugue-ppl dep. Verified live in a browser against the built pkg
(autoplay ladder, Replay, Reset, Step, readouts).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HmWLBR9Zq6hPG5o7URDuNJ
Copilot AI review requested due to automatic review settings July 28, 2026 15:10

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@alexnodeland
alexnodeland merged commit 51dc9fa into main Jul 28, 2026
8 checks passed
@alexnodeland
alexnodeland deleted the feat/chebyshev-and-inference-explorable branch July 28, 2026 15:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants